var HGAME = {};
var METHOD = {}
HGAME.versions = {
	'v1.0.0.0':{
		version:'v1.0.0.0',
		info:'1、初始化项目'
	}
}
function extend(O1,O2){
    if(typeof O2=="undefined"||typeof O1=="undefined")return;
    for(var i in O2){
        O1[i]=O2[i];
    }
}

/*创建img对象*/
METHOD.createImg=function(src){
    var img = new Image();
    img.src=src;
    return img;
};
//判断点是否在矩形里面
METHOD.inRect=function(point,Obj){
    if(point.x>=Obj.x&&Obj.x+Obj.w>=point.x&&point.y>=Obj.y&&Obj.y+Obj.h>=point.y)return true;
    return false
};
//托管对象的属性
METHOD.defineEx=function(O,key,val,after,before){
    var buf=val;
    Object.defineProperty(O,key,{
        set:function(v){
            before&&before.call(O,buf);
            buf=v;
            after&&after.call(O,buf);
        },
        get:function(){
            return buf;
        }
    });
};
/*随机获取数组中的一个元素*/
METHOD.getRandomItem=function(arr){
    return arr[parseInt(Math.random()*arr.length)];
};
HGAME.event=new Object();//事件对象
HGAME.event.clickBuffer=new Array();//缓存要添加事件的节点 click buffer
HGAME.attr=new Object();
HGAME.attr.bufCanvs=document.createElement("canvas");//缓存一个canvas做一些旋转 放大的操作
HGAME.attr.bufTxt=HGAME.attr.bufCanvs.getContext("2d");
/**
 * 画布类型
 * dom 节点
 * w 宽度
 * h 高度
 * clearColor 默认的颜色
 * child 对象的子代 子代的x y会相对于父代
 * W_INT 当一张图出现多帧的时候需要使用
 * H_INT 当一张图出现多帧的时候需要使用
 * x 画布的x 相对于画布来说x应该是不需要改变的
 * y 画布的y 相对于划不来说y应该是不需要改变的
 * CONST_BUF_X 在画布上的x 不用修改 修改了也没用
 * CONST_BUF_Y 在画布上的y 不用修改 修改了也没用
 */
HGAME.canvas=function(Obj){
    Obj=Obj||{};
    var defaultObj={
        dom:document.createElement("canvas"),
        w:500,
        h:500
    };
    var THIS = this;

    Object.defineProperty(this,"w",{
        set:function(a){
            THIS.dom.width=a;
        },
        get:function(){
            return THIS.dom.width;
        }
    });
    Object.defineProperty(this,"h",{
        set:function(a){
            THIS.dom.height=a;
        },
        get:function(){
            return THIS.dom.height;
        }
    });
    extend(defaultObj,Obj);
    extend(this,defaultObj);
    this.txt=this.dom.getContext("2d");
};
/**
 * 获取资源类型
 * data 一个资源字符串地址
 * loaded 所有资源加载完成
 * loadCall 加载资源的数字发生改变触发函数
 * loadNum 当前已经加载了多少资源
 * loadedSource 主动加载资源 当前资源对象的data会被改变 loadNum也会改变 触发的函数是第二个传入的参数
 * */
HGAME.source=function(Obj){
    Obj = Obj || {}
    var defaultObj = {
        data:[],
        loaded:function(THIS){},
        loadCall:function(num,allNum){},
        loadNum:0
    }
    extend(defaultObj,Obj);
    extend(this,defaultObj);
    var THIS = this;
    var $valueBuff="";
    THIS._struct="source";
    Object.defineProperty(this,"loadNum",{
        get:function(){
            return $valueBuff;
        },
        set:function(v){
            if(THIS.data) THIS.loadCall.call(THIS,v,THIS.data.length);
            $valueBuff=v;
        }
    })
    var buf = ""
    this.loadedSource = function (data,callBack){
    	if (!THIS.data) return;
    	THIS.data = data
    	THIS.lodaNum = 0;
    	for (var i = 0; i < THIS.data.length; i++) {
    		if (typeof this.data[i] == 'string') {
    			buf = THIS.data[i]
    			THIS.data[i] = new Image()
    			THIS.data[i].src = buf;
    			if (THIS.data[i].complete == true) {
    				THIS.data[i].width = parseInt(THIS.data[i].width)
    				THIS.data[i].height = parseInt(THIS.data[i].height)
    				THIS.loadNum++
    				if (THIS.loadNum == THIS.data.length) {
    					callBack.call(THIS,THIS)
    				}
    			} else {
    				THIS.data[i].onload = function(){
    					THIS.loadNum++;
    					if (THIS.loadNum == THIS.data.length) {
    						callBack.call(THIS,THIS)
    					}
    					THIS.width = parseInt(THIS.width)
    					THIS.height = parseInt(THIS.height)
    				}
    				THIS.data[i].onerror = function(){
    					window.debuggerSource = THIS
    				}
    			}
    		}
    	}
    }
    for(var i=0;i<this.data.length;i++){
        if(typeof this.data[i]=="string"){
            buf=this.data[i];
            this.data[i]=new Image();
            this.data[i].src=buf;
        }
    }
    for(i=0;i<this.data.length;i++){
        if(this.data[i].complete==true){
            this.data[i].width=parseInt(this.data[i].width);
            this.data[i].height=parseInt(this.data[i].height);
            this.loadNum++;
            if(this.loadNum==this.data.length){
                console.log(this);
                console.log("not Load:"+this.loadNum);
                this.loadNum=0;
                this.loaded.call(this,this);
            }
        }else{
            this.data[i].onload=function(){
                THIS.loadNum++;
                if(THIS.loadNum==THIS.data.length){
                    console.log(THIS.loadNum);
                    console.log("Load:"+THIS.loadNum);
                    THIS.loadNum=0;
                    THIS.loaded.call(THIS,THIS);
                }
                this.width=parseInt(this.width);
                this.height=parseInt(this.height);
            };
            this.data[i].onerror=function(){
               // window.debuggerSource=THIS;
                console.log(THIS)
            }
        }
    }
}
/*动画*/
HGAME.animate=function(Obj){
	Obj=Obj||{};
	var defaultObj={
	    time:30,//动画间隔
	    frequency:-1,//动画次数 -1表示无限制
	    action:function(){},//动画每一帧的动作
	    lastAction:function(){},//最后一次动画执行完成触发函数
	    aSecondAction:function(){//每隔一秒指向的函数
	    }
	};
	extend(defaultObj,Obj);
	var THIS = this;
	var oldTime=new Date();
	var newTime=null;
	this.time=defaultObj.time;
	this.frequency=defaultObj.frequency;
	this.action=defaultObj.action;
	this.lastAction=defaultObj.lastAction;
	this.aSecondAction=defaultObj.aSecondAction;
	this._struct="animate";
	this.stop=function(){
	    cancelAnimationFrame(THIS.INT_BUFFER);
	};
	/*FPS相关*/
	this.fpsDom=document.createElement("div");
	this.fpsInt=0;
	this.showFPS=function(){
	    document.body.appendChild(this.fpsDom);
	    this.fpsDom.style.cssText="position:fixed;left:0;top:0;z-index:1000;";
	    this.showFPSBool=true;
	};
	this.showFPSBool=false;
	this.fpsTime=new Date();
	THIS.INT_BUFFER=0;
	THIS.aSecondTime=new Date();
	this.run=function(){
		THIS.INT_BUFFER=requestAnimationFrame(THIS.run);
		newTime=new Date();
		if (THIS.showFPSBool == true) {
			THIS.fpsInt++;
			if (newTime - THIS.fpsTime>=1000) {
				THIS.fpsTime = newTime
				THIS.fpsDom.innerHtml = "FPS:"+THIS.fpsInt;
				THIS.fpsInt = 0
			}
		}
		if (newTime - THIS.aSecondTime >= 1000) {
			THIS.aSecondTime = newTime;
			THIS.aSecondAction.call(THIS,THIS)
		}
		if (newTime -oldTime > THIS.time) {
			oldTime = newTime
			if (THIS.frequency != -1) {
				if (THIS.frequency -1 == 0) {
					THIS.frequency--
					THIS.action.call(THIS,THIS)
					THIS.stop()
					return
				}
				if (THIS.frequency ==  0) {
					THIS.stop()
					return
				}
				THIS.frequency--
				THIS.action.call(THIS,THIS)
			} else {
				THIS.action.call(THIS,THIS)
				// THIS.stop()
			}
		}
	}
	this.action = Obj.action
	return this
}
/**
 * 2d对象类型
 * x 对象的x坐标
 * y 对象的y坐标
 * w 对象的宽度
 * h 对象的高度
 * color 对象的颜色
 * img 对象的img
 * child 对象的子代 子代的x y会相对于父代
 * W_INT 当一张图出现多帧的时候需要使用
 * H_INT 当一张图出现多帧的时候需要使用
 * CONST_BUF_X 在画布上的x 不用修改 修改了也没用
 * CONST_BUF_Y 在画布上的y 不用修改 修改了也没用
 *
 * click相关
 * clickFun 点击
 * isClick 是否添加点击事件
 */
 HGAME.Object2D=function(Obj){
 	Obj=Obj||{};
 	var defaultObj={
 	    x:0,
 	    y:0,
 	    w:20,
 	    h:20,
 	    lastDraw:false,
 	    W_INT:0,
 	    H_INT:0,
 	    color:"#cccccc",
 	    img:null,
 	    child:new Array(),
 	    CONST_BUF_X:0,
 	    CONST_BUF_Y:0,
 	    scale:1,
 	    clickFun:function(){},
 	    isClick:false,
 	    angle:0,//旋转角度
 	    faceAngle:0,//面向角度
 	    shadowColor:"",
 	    shadowBlur:0,
 	    shadowOffsetX:0,
 	    shadowOffsetY:0,
 	    repeatType:"none"
 	};
 	extend(defaultObj,Obj);
 	extend(this,defaultObj);
 	METHOD.defineEx(this,"angle",defaultObj.angle,function(){
 	    if(this.angle>360){
 	        this.angle=this.angle%360;
 	    }else if(this.angle<0){
 	        this.angle=this.angle%360+360;
 	    }
 	});
 	this.CONST_BUF_X=this.x;
 	this.CONST_BUF_Y=this.y;
 	this.rotatePointX=Obj.rotatePointX?Obj.rotatePointX:this.w/2;
 	this.rotatePointY=Obj.rotatePointY?Obj.rotatePointY:this.h/2;
 	this.rotateX=this.x;
 	this.rotateY=this.y;
 	this._struct="Object2D";
 	if(this.isClick){
 	    HGAME.event.clickBuffer.push(this);
 	}
 	this.add=function(Obj){
 	    this.child.push(Obj);
 	    Obj.parent=this;
 	};
 	this.remove=function(o){
 	    var index= this.child.indexOf(o);
 	    if(index>-1){
 	        this.child.splice(index,1);
 	    }
 	};
 	this.empty=function(){
 	    each(this.child,function(){
 	        this.parent=null;
 	    });
 	    this.child.splice(0,this.child.length);
 	}
 }
